In [1]:
!pip install geopy
!pip install tqdm
!pip install geocoder
In [2]:
# Import pandas
import pandas as pd
import geocoder as gc
from tqdm import tqdm
#from geopy.geocoders import Nominatim
#from geopy.distance import vincenty
# Import BoxPlot, output_notebook, and show from bokeh.charts
from bokeh.charts import BoxPlot, Donut, Bar, Histogram, output_notebook, show
from bokeh.charts.attributes import cat, color
from bokeh.charts.operations import blend
from bokeh.layouts import gridplot, row
from bokeh.models import HoverTool
from bokeh.models.widgets import Panel, Tabs
from bokeh.plotting import ColumnDataSource
In [3]:
# Assign spreadsheet filename: file
file = 'imd_student_blind.xlsx'
# Load spreadsheet: xl
xl = pd.ExcelFile(file)
# Print sheet names
print(xl.sheet_names)
In [4]:
# Load a sheet into a DataFrame by index: df
df = xl.parse(0)
# Print the head of the DataFrame df
df.head()
Out[4]:
In [5]:
df.columns
Out[5]:
In [6]:
df.shape
Out[6]:
In [7]:
#Cópia por valores, não mexer no DF principal
disciplinas = df.copy()
disciplinas.info()
In [8]:
disciplinas.columns.values.tolist()
Out[8]:
In [9]:
#Retira informações desnecessárias para essa análise
disciplinas.drop(disciplinas.columns[0:4], axis=1, inplace=True)
In [10]:
#Objetivo 1 -> Média da disciplina X por período e ano
#Objetivo 2 -> Taxa de trancamento e cancelamento por período e ano
disciplinas.columns.values.tolist()
Out[10]:
In [11]:
disciplinas = disciplinas[disciplinas['status'] == 'ATIVO']
disciplinas.head()
Out[11]:
In [12]:
disciplinas_categorias = disciplinas.groupby(['ano_disciplina', 'periodo_disciplina', 'disciplina_ID']).mean()
# convert the index to a column
disciplinas_categorias.reset_index(inplace = True )
disciplinas_categorias.info()
In [13]:
disciplinas_categorias[disciplinas_categorias['disciplina_ID'] == 0]
Out[13]:
In [14]:
# Make a box plot: p
p = BoxPlot(disciplinas_categorias, values='nota', label='disciplina_ID', color='disciplina_ID',
title='Distribuição da média de notas das disciplinas',
legend='bottom_right')
# Set the y axis label
p.yaxis.axis_label='Média por período'
p.add_tools(HoverTool(tooltips=[("Nota", "$y")]))
# Call the output_notebook()
output_notebook()
show(p)
In [15]:
ps = []
#tbs = []
for atual in range(0,7):
p = BoxPlot(disciplinas_categorias[disciplinas_categorias['disciplina_ID'] == atual], values='nota', label='periodo_disciplina',
color='periodo_disciplina', title='Ddisciplina '+str(atual), legend='bottom_right')
p.yaxis.axis_label='Média por período'
p.add_tools(HoverTool(tooltips=[("Nota", "$y")]))
#temp = Panel(child=p, title='Ddisciplina '+str(atual))
#tbs.append(temp)
ps.append(p)
# Make a box plot: p
# Set the y axis label
grid = gridplot([ps[0:2], ps[2:4], ps[4:6], [None, ps[6]]], sizing_mode='scale_width')
#grid = gridplot([[ps[0], ps[1]], [ps[2], ps[3]], [ps[4], ps[5]], [None, ps[6]]], sizing_mode='scale_width')
#tabs = Tabs(tabs=[ tbs[0], tbs[5] ],sizing_mode='scale_width' )
#show(tabs)
# show the results
show(grid)
In [16]:
##Quantidade de alunos ativos/Trancados/cancelados/...
count_series = pd.DataFrame(columns=('Status', 'Count'))
count_series["Status"] = df["status"].unique().tolist()
tam = len(df)
for atual in range(0,len(count_series)):
count_series.iloc[atual]["Count"] = df[df["status"] == count_series.iloc[atual]["Status"]]["status"].count()
def porcent(val):
p = (val*100)/tam
return p
graph = Donut(count_series, label="Status", values="Count", title="Situação dos alunos" )
graph.add_tools(HoverTool(tooltips=[("Alunos", str(count_series.iloc[1]["Count"])+"/"+str(tam)), #falta trocar o 1 pelo número de alunos da categoria
("Porcentagem", str(porcent(1000))) #falta trocar o 1000 pelo numero de alunos da categoria
]
))
show(graph)
In [17]:
###Verificar desistência
def popula(string):
aux = []
for atual in range (2014, 2017):
aux.append(df[df["ano_ingresso"] == atual][df["status"] == string]["status"].count())
return aux
count_desist = pd.DataFrame(columns=('ANO', 'CANCELADO', 'ATIVO', 'TRANCADO', 'CONCLUIDO', 'FORMANDO', 'FORMADO'))
count_desist["ANO"] = [2014, 2015, 2016]
for atual in count_desist.columns.values:
if atual != "ANO":
count_desist[atual] = popula(atual)
print(count_desist)
In [18]:
BLEND = blend('CANCELADO', "ATIVO", "TRANCADO", "CONCLUIDO", "FORMANDO", "FORMADO",
name='unidade', labels_name='Situacao')
bar = Bar(count_desist, values=BLEND,
label=cat(columns='ANO', sort=False),
stack=cat(columns='Situacao', sort=False),
color="Situacao",
legend='bottom_center',
title="Índice de formação e desitencia de alunos por ano",
ylabel = "Alunos",
tooltips=[('Tipo', "$y")]) ##Corrigir isso também
output_notebook()
show(bar)
In [19]:
###Verificar NOtas ENEM
ps = []
temp = ["nota", "enen-nota", "enem-matematica", "enem-redacao"]
for atual in range(0, len(temp)):
p = BoxPlot(disciplinas_categorias, values=temp[atual], label='disciplina_ID',
color='disciplina_ID', title=str(temp[atual])+" x Desempenho em disciplinas ", legend='bottom_right')
p.yaxis.axis_label='Média por período'
p.add_tools(HoverTool(tooltips=[("Nota", "$y{f.fff}")]))
#temp = Panel(child=p, title='Ddisciplina '+str(atual))
#tbs.append(temp)
ps.append(p)
grid = gridplot([ps[0:2], ps[2:4]], sizing_mode='scale_width')
output_notebook()
show(grid)
In [20]:
#Verificar distancias
distancias = df[df["status"] == "ATIVO"].copy()
distancias["LAT"], distancias["LON"], distancias["KM"] = [0,0,0]
distancias = distancias.reset_index()
uf = gc.google("59064741").latlng
for i in tqdm(range(0,100)): ## trocar o range por range(len(distancias))
st = distancias.loc[i,'CEP']
g = gc.google(st)
if g.lat == None:
distancias.loc[i, "LAT"] = 0
elif g.lng == None:
distancias.loc[i, "LON"] = 0
else:
distancias.loc[i, "LON"] = g.lng
distancias.loc[i, "LAT"] = g.lat
print("Completo")
distancias.to_csv('LatLong_Alunos.csv', encoding="utf-8")
##Salva tabela criada
#UFRN 59064-741
distancias.head()
In [59]:
distancias = pd.read_csv('LatLong_Alunos.csv', encoding="utf-8", index_col=0)
for atual in tqdm(range(0,100)): ## trocar o range por range(len(distancias))
lt = distancias.loc[atual, "LAT"]
ln = distancias.loc[atual, "LON"]
if lt != 0. and ln != 0.:
compare = (lt, ln)
#print(vincenty(uf, compare).km)
distancias.loc[atual, "KM"] = vincenty(uf, compare).km
distancias.head()
Out[59]:
In [60]:
def binSearch(array, ano, periodo, element_to_search):
for index in range(len(array)):
if((periodo == array[index]['PERIODO'] and ano == array[index]['ANO']) and element_to_search == array[index]['DISCIPLINA']):
return index
return -1
In [61]:
import copy
def catchTRA(array, tra):
dict_model = {'ANO': '', 'PERIODO': '', 'DISCIPLINA': 0, 'NUMERO_DE_ALUNOS': 0, 'PORCENTAGEM': 0}
anos= [2014, 2015, 2016]
periodos = [1, 2]
for ano in anos:
for periodo in periodos:
temp_df1 = df[df['status.disciplina'] == tra]
temp_df2 = temp_df1[temp_df1['periodo_disciplina'] == periodo]
temp_df3 = temp_df2[temp_df2['ano_disciplina'] == ano]
#print(temp_df2)
for index in range(len(temp_df3)):
disciplina = temp_df3.iloc[index]['disciplina_ID']
bin_result = binSearch(array, ano, periodo, disciplina)
if bin_result == -1:
temp_dict = copy.copy(dict_model)
temp_dict['ANO'] = ano
temp_dict['PERIODO'] = periodo
temp_dict['DISCIPLINA'] = disciplina
temp_dict['NUMERO_DE_ALUNOS'] = 1
array.append(temp_dict)
else:
array[bin_result]['NUMERO_DE_ALUNOS'] += 1
for index in range(len(array)):
index_total_estudantes = df[df['ano_disciplina'] == array[index]['ANO']]
index_total_estudantes = index_total_estudantes[index_total_estudantes['periodo_disciplina'] == array[index]['PERIODO']]
index_total_estudantes = index_total_estudantes[index_total_estudantes['disciplina_ID'] == array[index]['DISCIPLINA']]
index_total_estudantes = len(index_total_estudantes)
array[index]['PORCENTAGEM'] = (array[index]['NUMERO_DE_ALUNOS']/index_total_estudantes) * 100
In [62]:
reprovados = []
catchTRA(reprovados, 'Reprovado')
In [63]:
aprovados = []
catchTRA(aprovados, 'Aprovado')
In [64]:
import numpy as np
import scipy.special
from bokeh.layouts import gridplot
from bokeh.plotting import figure, show, output_file
def cria_graficos_barras_apro_repro(array, disciplina, titulo_grafico):
dados = []
anos= [2014, 2015, 2016]
periodos = [1, 2]
for ano in anos:
for periodo in periodos:
for index in range(len(array)):
if (array[index]['ANO'] == ano and array[index]['PERIODO'] == periodo) and array[index]['DISCIPLINA'] == disciplina:
dados.append(array[index]['PORCENTAGEM'])
data = {
'semestres': ['2014.1', '2014.2', '2015.1', '2015.2', '2016.1', '2016.2'],
'porcentage': dados
}
# table-like data results in reconfiguration of the chart with no data manipulation
bar2 = Bar(data, values='porcentage', label=['semestres'], title=titulo_grafico, plot_width=400)
output_file("stacked_bar.html")
show(row(bar2))
In [65]:
cria_graficos_barras_apro_repro(aprovados, 0, 'Aprovados disciplina 0')
cria_graficos_barras_apro_repro(aprovados, 1, 'Aprovados disciplina 1')
cria_graficos_barras_apro_repro(aprovados, 2, 'Aprovados disciplina 2')
cria_graficos_barras_apro_repro(aprovados, 3, 'Aprovados disciplina 3')
cria_graficos_barras_apro_repro(aprovados, 5, 'Aprovados disciplina 5')
cria_graficos_barras_apro_repro(aprovados, 6, 'Aprovados disciplina 6')
In [66]:
cria_graficos_barras_apro_repro(reprovados, 0, 'Reprovados disciplina 0')
cria_graficos_barras_apro_repro(reprovados, 1, 'Reprovados disciplina 1')
cria_graficos_barras_apro_repro(reprovados, 2, 'Reprovados disciplina 2')
cria_graficos_barras_apro_repro(reprovados, 3, 'Reprovados disciplina 3')
cria_graficos_barras_apro_repro(reprovados, 5, 'Reprovados disciplina 5')
cria_graficos_barras_apro_repro(reprovados, 6, 'Reprovados disciplina 6')
In [21]:
# Import pandas
import pandas as pd
import geocoder as gc
from tqdm import tqdm
from geopy.geocoders import Nominatim
from geopy.distance import vincenty
# Import BoxPlot, output_notebook, and show from bokeh.charts
from bokeh.charts import BoxPlot, Donut, Bar, Histogram, output_notebook, show
from bokeh.charts.attributes import cat, color
from bokeh.charts.operations import blend
from bokeh.layouts import gridplot, row
from bokeh.models import HoverTool
from bokeh.models.widgets import Panel, Tabs
from bokeh.plotting import ColumnDataSource
In [22]:
#Verificar distancias
distancias = df[df["status"] == "ATIVO"].copy()
distancias["LAT"], distancias["LON"], distancias["KM"] = [0,0,0]
distancias = distancias.reset_index()
uf = gc.google("59064741").latlng
for i in tqdm(range(len(distancias))): ## trocar o range por range(len(distancias))
st = distancias.loc[i,'CEP']
g = gc.google(st)
if g.lat == None:
distancias.loc[i, "LAT"] = 0
elif g.lng == None:
distancias.loc[i, "LON"] = 0
else:
distancias.loc[i, "LON"] = g.lng
distancias.loc[i, "LAT"] = g.lat
print("Completo")
distancias.to_csv('LatLong_Alunos3.csv', encoding="utf-8")
##Salva tabela criada
#UFRN 59064-741
distancias.head()
In [38]:
distancias.reset_index()
Out[38]:
In [71]:
distancias = pd.read_csv('LatLong_Alunos3.csv', encoding="utf-8", index_col=0)
for atual in tqdm(range(len(distancias))): ## trocar o range por range(len(distancias))
lt = distancias.loc[atual, "LAT"]
ln = distancias.loc[atual, "LON"]
if lt != 0. and ln != 0.:
compare = (lt, ln)
#print(vincenty(uf, compare).km)
distancias.loc[atual, "KM"] = vincenty(uf, compare).km
distancias.to_csv('LatLong_Alunos.csv', encoding="utf-8")
distancias.head()
Out[71]:
In [44]:
#Considera apenas as aprovações -> Validação 1
distancias = distancias[distancias["status.disciplina"] == 'Aprovado']
#Removendo distâncias desnecessárias -> Validação 2 e 3
distancias = distancias[distancias['KM'] != 0]
distancias = distancias[distancias['CEP'] != 0]
#Validação 4
distancias = distancias[distancias['KM'] < 30]
distancias
Out[44]:
In [72]:
#Lista com ID dos alunos validados
alunos_validos = distancias.a_ID.unique()
alunos_validos
Out[72]:
In [73]:
#Valores 'chave' da análise
valor_x_list = []
valor_y_list = []
for i in range(len(alunos_validos)):
#Seleciona todas as ocorrências do aluno com aquele ID
aluno = distancias[distancias["a_ID"] == alunos_validos[i]]
#Calcula média das notas para aquele aluno
media = aluno['nota'].mean()
distancia_UF = aluno['KM'].mean()
#Adiciona resultado à lista de distribuição X
if( media <= 6.0 ):
valor_x_list.append(0)
elif( media > 6.0 and media <= 7.0 ):
valor_x_list.append(1)
elif( media > 7.0 and media <= 8.0 ):
valor_x_list.append(2)
else:
valor_x_list.append(3)
#Adiciona resultado à lista de distribuição Y
if( distancia_UF <= 1.5 ):
valor_y_list.append(0)
elif( distancia_UF > 1.5 and distancia_UF <= 4.0 ):
valor_y_list.append(1)
elif( distancia_UF > 4.0 and distancia_UF <= 8.0 ):
valor_y_list.append(2)
else:
valor_y_list.append(3)
In [74]:
#Tabela de Ocorrências
distribuicao = pd.DataFrame(columns=('Valor X_Nota', 'Valor Y_Distancia', 'Xi - Xmed', 'Yi - Ymed'
, 'Prod', '(Xi - Xmed)^2', '(Yi - Ymed)^2' ) )
distribuicao["Valor X_Nota"] = valor_x_list
distribuicao["Valor Y_Distancia"] = valor_y_list
distribuicao
#distancias["LAT"], distancias["LON"], distancias["KM"] = [0,0,0]
Out[74]:
In [75]:
xmed = distribuicao['Valor X_Nota'].mean()
ymed = distribuicao['Valor Y_Distancia'].mean()
In [76]:
dif_X = []
dif_Y = []
prod = []
for i in range(len(alunos_validos)):
#Calcula diferença para cada valor de X e salva numa lista
difX = valor_x_list[i] - xmed
dif_X.append(difX)
#Calcula diferença para cada valor de Y e salva numa lista
difY = valor_y_list[i] - ymed
dif_Y.append(difY)
#Calcula produto entre valores
prod_Difs = difX*difY
prod.append(prod_Difs)
#Adiciona na tabela
distribuicao["Xi - Xmed"] = dif_X
distribuicao["Yi - Ymed"] = dif_Y
distribuicao["Prod"] = prod
In [53]:
distribuicao
Out[53]:
In [77]:
passo1 = distribuicao['Prod'].sum()
covXY = passo1/(len(alunos_validos)-1)
covXY
Out[77]:
In [78]:
dif_X_quadrada = []
dif_Y_quadrada = []
for i in range(len(alunos_validos)):
#Eleva cada diferença ao quadrado
difX_quad = dif_X[i]*dif_X[i]
dif_X_quadrada.append(difX_quad)
#Eleva cada diferença ao quadrado
difY_quad = dif_Y[i]*dif_Y[i]
dif_Y_quadrada.append(difY_quad)
#Adiciona na tabela
distribuicao["(Xi - Xmed)^2"] = dif_X_quadrada
distribuicao["(Yi - Ymed)^2"] = dif_Y_quadrada
In [79]:
distribuicao
Out[79]:
In [80]:
passo21 = distribuicao['(Xi - Xmed)^2'].sum()
passo22 = distribuicao['(Yi - Ymed)^2'].sum()
#Variância de X
varX = passo21/(len(alunos_validos)-1)
#Variância de Y
varY = passo22/(len(alunos_validos)-1)
In [81]:
varX
Out[81]:
In [82]:
varY
Out[82]:
In [83]:
from math import sqrt
desvio_padraoX = sqrt(varX)
desvio_padraoY = sqrt(varY)
#Calculo da correlação
corrXY = covXY/(desvio_padraoX*desvio_padraoY)
corrXY
Out[83]:
In [ ]: